// docker-entrypoint.js
// 启动入口脚本：验证并初始化配置文件，然后启动应用

const fs = require('fs');
const path = require('path');

// ========== 路径定义 ==========
const _配置目录 = '/app/代码/配置';
const _认证文件 = path.join(_配置目录, '用户认证.json');
const _日志文件 = path.join(_配置目录, '认证失败记录.log');
const _跨域文件 = path.join(_配置目录, '跨域列表.txt');

// ========== 确保配置目录存在 ==========
if (!fs.existsSync(_配置目录)) {
  fs.mkdirSync(_配置目录, { recursive: true });
  console.log('✅ 创建配置目录:', _配置目录);
}

// ========== 工具函数：生成14位随机字符串（a-z, 0-9）==========
function _生成随机令牌() {
  const _字符集 = 'abcdefghijklmnopqrstuvwxyz0123456789';
  let _结果 = '';
  for (let _i = 0; _i < 14; _i++) {
    const _随机索引 = Math.floor(Math.random() * _字符集.length);
    _结果 += _字符集[_随机索引];
  }
  return _结果;
}

// ========== 1. 检查并初始化 用户认证.json ==========
if (!fs.existsSync(_认证文件) || fs.statSync(_认证文件).size === 0) {
  console.log('⚠️  用户认证.json 文件不存在或为空，正在初始化...');

  // 生成随机令牌
  const _令牌 = _生成随机令牌();

  // 构建要写入的对象
  const _认证数据 = [
    {
      "用户名": "默认用户",
      "令牌": _令牌
    }
  ];

  // 格式化写入 JSON 文件（美化输出）
  const _格式化内容 = JSON.stringify(_认证数据, null, 2);
  fs.writeFileSync(_认证文件, _格式化内容, 'utf8');

  console.log('✅ 已创建 用户认证.json 文件');
  console.log(`🔑 生成的令牌: ${_令牌}`);
} else {
  console.log('✅ 用户认证.json 文件已存在，正在验证内容...');

  // 如果文件存在且非空，进行验证
  let _解析数据;
  try {
    const _文件内容 = fs.readFileSync(_认证文件, 'utf8');
    _解析数据 = JSON.parse(_文件内容);
  } catch (err) {
    console.error('❌ 错误：用户认证.json 解析失败:', err.message);
    process.exit(1);
  }

  if (!Array.isArray(_解析数据)) {
    console.error('❌ 错误：用户认证.json 必须是一个数组');
    process.exit(1);
  }

  for (let _索引 = 0; _索引 < _解析数据.length; _索引++) {
    const _用户项 = _解析数据[_索引];
    if (!_用户项.hasOwnProperty('用户名')) {
      console.error(`❌ 错误：第 ${_索引 + 1} 个对象缺少 "用户名" 字段`);
      process.exit(1);
    }
    if (!_用户项.hasOwnProperty('令牌')) {
      console.error(`❌ 错误：第 ${_索引 + 1} 个对象缺少 "令牌" 字段`);
      process.exit(1);
    }
  }

  console.log('✅ 用户认证.json 验证通过');
}

// ========== 2. 确保日志文件存在 ==========
if (!fs.existsSync(_日志文件)) {
  fs.writeFileSync(_日志文件, '');
  console.log('✅ 创建认证失败记录.log文件');
} else {
  console.log('✅ 认证失败记录.log文件已存在');
}

// ========== 3. 确保跨域文件存在 ==========
if (!fs.existsSync(_跨域文件)) {
  fs.writeFileSync(
    _跨域文件,
    '// 一行一个允许跨域的域名，不要写路径，// 开头的会忽略\n\n'
  );
  console.log('✅ 创建跨域列表.txt文件');
} else {
  console.log('✅ 跨域列表.txt文件已存在');
}

// ========== 启动主应用 ==========
console.log('🚀 所有检查完成，启动应用程序...');
require('child_process').execSync('npm run start', { stdio: 'inherit' });